package Controlador;

import java.util.ArrayList;
import java.util.Date;
import java.util.Random;
import Modelo.*;

public class ControladorGenerarCompetencia {

	private ControladorVentanaPpal ventanaMenu;
	private Panamericano pana;
    private Juez juez;
    private Nadadores nadador;
    private Equipos equipo;
    private String modalidad;
    private ArrayList<Competencia> competencia;
	private int contJuez = 0;

	public ControladorGenerarCompetencia() {
		super();
	    this.pana = ventanaMenu.panamericano;
	    this.competencia = new ArrayList<Competencia>();
	    this.competencia = pana.getCompetencia();
	}
	
	
	private void generarCarril(Competencia competencia, char sexo, String modalidad){
		
		double nadadorNumero;
		Equipos equip = new Equipos();
		ArrayList<Nadadores> nadadores = new ArrayList<Nadadores>();
		ArrayList<Nadadores> arregloNadadorCarril = new ArrayList<Nadadores>();
		ArrayList<Integer> arregloNumero = new ArrayList<Integer>();
		
		
		if(competencia.getFase().equals("Eliminatoria")){
			competencia.getNadadoresCarril().clear();
			arregloNumero.clear();
			
			for(int i = 0; i < pana.getEquipo().size(); i++) {
				
				equip = pana.getEquipo().get(i);
				nadadores = equip.getNadadores();
				for(int p = 0; p < nadadores.size(); p++){
					
					nadador = nadadores.get(p);
					String sexoString = String.valueOf(nadador.getSexo());
					String sexoString2 = String.valueOf(sexo);
					
					if( (sexoString.equals(sexoString2)) && (nadador.getEstilo().equals(modalidad)) ) {
						
						
						competencia.agregarNadadorCarril(nadador);
					}
				}
			}
		}
		
	}
	
	
	private void generarJuez(Competencia competencia){
		
		if(contJuez >= pana.contarJuez()) {
			contJuez = 0;
		}
		competencia.setJuez(pana.getjuez(contJuez));
		contJuez++;
	}
	
	
	private void generarTiempo(Competencia competencia, String metros){
		
		Random rnd = new Random();
		float tiempo = 0;
		rnd.setSeed(new Date().getTime());
		
		for(int i = 0; i < competencia.getNadadoresCarril().size(); i++) {
			
			if(metros.equals("50")) {
				
				tiempo = (float)(rnd.nextDouble() * (35-25) + 25);
				competencia.getNadadoresCarril().get(i).setTiempo(tiempo);
				
			} else if(metros.equals("100")) {
				
				tiempo = (float)(rnd.nextDouble() * (65-55) + 55);
				competencia.getNadadoresCarril().get(i).setTiempo(tiempo);
				
			}
		}
		
	}
	
	
	
	private void ordenarPosiciones(Competencia competencia){
		
		float tiempo = 0;
		float tiempo2 = 0;
		Nadadores primero, segundo, auxiliar;
		
		for(int k = 0; k < competencia.getNadadoresCarril().size(); k++) {
			competencia.getPosiciones().add(competencia.getNadadoresCarril().get(k));
		}
		
		for(int j = 0; j < competencia.getPosiciones().size() - 1; j++){
			for(int i = 0; i < competencia.getPosiciones().size() - 1; i++){
				tiempo = competencia.getPosiciones().get(i).getTiempo();
				tiempo2 = competencia.getPosiciones().get(i+1).getTiempo();
				if(tiempo2 < tiempo){
					primero = competencia.getPosiciones().get(i+1);
					segundo = competencia.getPosiciones().get(i);
					auxiliar = segundo;
					competencia.getPosiciones().set(i, primero);
					competencia.getPosiciones().set(i+1, auxiliar);
				}
			}
		}
	}
	
	private ArrayList<Nadadores> seleccionarMejores4(ArrayList<Nadadores> posicionesA, ArrayList<Nadadores> posicionesB){
		
		ArrayList<Nadadores> mejores = new ArrayList<Nadadores>();
		Competencia competenciaMejores = new Competencia();
		Nadadores nadadorMejor = new Nadadores();
		
		for(int i = 0; i < posicionesA.size(); i++){
			mejores.add(posicionesA.get(i));
		}
		
		for(int i = 0; i < posicionesB.size(); i++){
			mejores.add(posicionesB.get(i));
		}
		
		competenciaMejores.setNadadoresCarril(mejores);
		ordenarPosiciones(competenciaMejores);
		mejores.clear();
		mejores = new ArrayList<Nadadores>();
		
		for(int i = 0; i < 4; i++) {
			nadadorMejor = competenciaMejores.getPosiciones().get(i);
			mejores.add(nadadorMejor);
		}
		
		return mejores;
	}
		
	
	
	
	private String sacarFecha(int dia, int contDias){
		
		Date fecha = new Date();
		int mes, anno;
		String fechaCompleta;
        
		dia = dia + contDias;
		
		mes = fecha.getMonth() + 1;
        anno = fecha.getYear() + 1900;
        fechaCompleta = dia+"-"+mes+"-"+anno;
        
        return fechaCompleta;
	}
	
	private String sacarHora(int cont){
		
		String[] hora = new String[]{"8:00am", "8:30am", "9:00am", "9:30am", "10:00am", "10:30am", "11:00am", "11:30am",
						"12:00pm", "12:30pm", "1:00pm", "1:30pm", "2:00pm", "2:30pm", "3:00pm", "3:30pm", "4:00pm", "4:30pm",
						"5:00", "5:30pm", "6:00pm", "6:30pm", "7:00pm", "7;30pm", "8:00pm", "8:30pm", "9:00pm", "9:30pm"};
		return hora[cont];
	}
		
		
	private void llenarCompetencia(String estilo, String hora, String fase, Competencia competenciaAux, String fecha, char sexo,
						String metros, ArrayList<ArrayList<Nadadores>> generalPosiciones) {
		
		
		int codCompetencia = 0;
		if(this.competencia.size() == 0) {
			codCompetencia = 0;
		} else {
			codCompetencia = this.competencia.get(this.competencia.size() - 1).getCodCompetencia();
		}
		codCompetencia++;
		competenciaAux.setCodCompetencia(codCompetencia);
		competenciaAux.setFase(fase);
		competenciaAux.setModalidad(estilo);
		competenciaAux.setFecha(fecha);
		competenciaAux.setHora(hora);
		generarCarril(competenciaAux, sexo, estilo);
		generarJuez(competenciaAux);
		generarTiempo(competenciaAux, metros);
		ordenarPosiciones(competenciaAux);
		generalPosiciones.add(competenciaAux.getPosiciones());
		this.competencia.add(competenciaAux);
	}
	
	
	private void generarCompetenciaMetros(String fecha, String metros, String modalidad, char sexo){
		
		int contEliminatoria = 0;
		int contCompetencia = 0;
		boolean eliminatoria = false;
		String hora;
		Competencia competenciaAux = new Competencia();
		ArrayList<Nadadores> nadadores = new ArrayList<Nadadores>();
		ArrayList<ArrayList<Nadadores>> generalPosiciones = new ArrayList<ArrayList<Nadadores>>();
		ArrayList<ArrayList<Nadadores>> generalPosiciones2 = new ArrayList<ArrayList<Nadadores>>();
		
		generalPosiciones.clear();
		generalPosiciones2.clear();
		
		for(int i = 0; i < 2; i++) {
			while(!eliminatoria) {
				
				hora = sacarHora(contCompetencia);
				llenarCompetencia(modalidad, hora, "Eliminatoria", competenciaAux, fecha, sexo, metros, generalPosiciones);
				
				contCompetencia++;
				
				if(contEliminatoria == 3) {
					eliminatoria = true;
				} else { 
					contEliminatoria++;
				}
			}
			if(i == 0){
				nadadores = seleccionarMejores4(generalPosiciones.get(i), generalPosiciones.get(i+1));
			} else {
				nadadores = seleccionarMejores4(generalPosiciones.get(i+1), generalPosiciones.get(i+2));
			}
			
			hora = sacarHora(contCompetencia);
			competenciaAux.setNadadoresCarril(nadadores);
			llenarCompetencia(modalidad, hora, "SemiFinal", competenciaAux, fecha, sexo, metros, generalPosiciones2);
			contCompetencia++;
		}
		nadadores.clear();
		nadadores = seleccionarMejores4(generalPosiciones2.get(0), generalPosiciones2.get(1));
		competenciaAux.setNadadoresCarril(nadadores);
		hora = sacarHora(contCompetencia);
		llenarCompetencia(modalidad, hora, "Final", competenciaAux, fecha, sexo, metros, generalPosiciones2);
		generarMedallas(generalPosiciones2);
	}
          
	
	public void generarTodasCompetencias() {
		
		String[] estilo = new String[] { "Libre", "Pecho", "Espalda", "Mariposa" };
		String[] metros = new String[] { "50", "100", "50", "100" };
		char[] sexo = new char[] { 'F', 'F', 'M', 'M' };
		String modalidad;
		String metrosModo;
		String fechaCompetencia;
		Date fecha = new Date();
		int dia = fecha.getDay() + 7;
		char sexoModo;
		
		for(int i = 0; i < 4; i++) {
			
			modalidad = estilo[i];
			fechaCompetencia = sacarFecha(dia, i);
			
			for(int p = 0; p < 4; p++) {
				sexoModo = sexo[p];
				metrosModo = metros[p];
				generarCompetenciaMetros(fechaCompetencia, metrosModo, modalidad, sexoModo);
			}
			
		}
		
	}

	private void generarMedallas(ArrayList<ArrayList<Nadadores>> arregloGeneralPosiciones) {
		
		int contOro = 0;
		int contPlata = 0;
		int contBronce = 0;
		Nadadores nadador = new Nadadores();
		ArrayList<Nadadores> arregloInterno = new ArrayList<Nadadores>();
		ArrayList<Nadadores> nadadoresEquipo = new ArrayList<Nadadores>();
		
		for(int i = 0; i < arregloGeneralPosiciones.size(); i++) {
			
			arregloInterno = arregloGeneralPosiciones.get(i);
			
			for(int p = 0; p < arregloInterno.size(); p++) {
				
				for(int k = 0; k < pana.getEquipo().size(); k++) {
					nadadoresEquipo = pana.getEquipo().get(k).getNadadores();
					
					for(int n = 0; n < nadadoresEquipo.size(); n++) {
						
						nadador = nadadoresEquipo.get(n);
						if( (nadador.getCedula().equals(arregloInterno.get(p).getCedula())) && (p == 0)) {
							contOro = pana.getEquipo().get(k).getMedallaO() + 1;
							pana.getEquipo().get(k).setMedallaO(contOro);
							
						} else if( (nadador.getCedula().equals(arregloInterno.get(p).getCedula())) && (p == 1)) {
							contPlata = pana.getEquipo().get(k).getMedallaP() + 1;
							pana.getEquipo().get(k).setMedallaP(contPlata);
							
						} else if( (nadador.getCedula().equals(arregloInterno.get(p).getCedula())) && (p == 2)) {
							contBronce = pana.getEquipo().get(k).getMedallaB() + 1;
							pana.getEquipo().get(k).setMedallaP(contBronce);
						}
					}
				}
			}
		}
	}
	      
}

